Next:
Better Design
, Previous:
Property Observer
, Up:
Index
Implied Null Object
호출과 집행 두 가지 절차로 로깅을 나누어서 처리한다.
(인터페이스 종속된 부분(호출)과 실제 로그를 저장하는 부분(집행)을 구분해서 구현)
struct
OptionalLogger
:
Logger
{
shared_ptr
<
Logger
>
impl
;
static
shared_ptr
<
Logger
>
no_logging
;
Logger
(
const
shared_ptr
<
Logger
>&
logger
)
:
impl
(
logger
)
{
}
virtual
void
info
(
const
string
&
s
)
override
{
if
(
impl
)
impl
->
info
(
s
)
;
// null
여
부
검
사
}
// ...
}
;
// static
멤
버
변
수
(null object)
shared_ptr
<
Logger
>
BankAccount
::
no_logging
{
}
;
shared_ptr
<
OptionalLogger
>
logger
;
BankAccount
(
const
string
&
name
,
int
balance
,
const
shared_ptr
<
Logger
>&
logger
=
no_logging
)
:
log
{
make_shared
<
OptionalLogger
>
(
logger
)}
,
name
(
name
)
,
balance
(
balance
)
{
}
//
사
용
BankAccount
account
{
"
primary account
"
,
1000
}
;
accoutn
.
deposit
(
2000
)
;
Pimpl을 이용함